package mapybxb

import "fmt"

// 定义map集合
func TestDefineMap() {
	// 方式1:声明map类型的变量，此时没有初始化
	//定义Map:不规范的定义方式, 不推荐，此时还未申请内存，仅仅是做了声明
	//var map1 map[string]int
	//map1["ybxb"] = 18  // 此时map还未初始化(申请内存)，所以无法存放元素
	//fmt.Println(map1)

	//方式2:推荐:声明 + 申请内存
	// var map2 = map[string]int{}
	var map2 = map[string]int{"张三": 12} // 指定初始化
	map2["ybxb-map2"] = 18
	fmt.Println(map2)

	//方式2：推荐,第二个参数是map的长度,建议初始化时，估算好map的长度避免在使用的过程中进行扩容,从而影响效率。
	var map3 = make(map[string]int, 10) // 后面的10是容量, 或不指定容量:make(map[string]int)
	map3["ybxb-map3"] = 20
	fmt.Println(map3)
}

func TestInitMap() {
	var userInfo = map[string]string{
		"username": "root",
		"password": "123456",
	}
	fmt.Println(userInfo)
	// 打印结果:map[password:123456 username:root]
	// 注意：key是无序的
}

// 判断key是否存在
func TestEsistsKey() {
	var userInfo = map[string]int{"张三": 12, "李四": 18}
	v, ok := userInfo["张三1"] // 判断是否存在指定的key
	if ok {
		fmt.Println("存在, 值是：", v)
	} else {
		fmt.Println("不存在")
	}
}

// 删除指定key的元素
func TestDeleteKey() {
	var userInfo = map[string]int{"张三": 12, "李四": 18}
	fmt.Println("删除前:", userInfo) // 删除前: map[张三:12 李四:18]
	delete(userInfo, "张三")        // delete函数是内置函数
	fmt.Println("删除后:", userInfo) // 删除后: map[李四:18]
}

// range的方式遍历map
func TestForMap() {
	var userInfo = map[string]string{"username": "ybxb", "pwd": "123", "sex": "男"}
	// 返回参数是key和value
	for key, value := range userInfo {
		fmt.Printf("key值是%s, value是：%s\n", key, value)
	}
}

// range的方式遍历map的key
func TestForMapKey() {
	var userInfo = map[string]string{"username": "ybxb", "pwd": "123", "sex": "男"}
	for key := range userInfo {
		fmt.Println("key是:", key)
	}
}

// 注意：range：遍历map时，返回一个值时，是key，返回两个值时，是key和value。
func TestForMapKey1() {
	var userInfo = map[string]string{"username": "ybxb", "pwd": "123", "sex": "男"}
	for key, _ := range userInfo {
		fmt.Println("key是:", key)
	}
}

// 通过key获取value
func TestGetValueByKey() {
	var userInfo = map[string]string{"username": "ybxb", "pwd": "123", "sex": "男"}
	fmt.Println("username", ":", userInfo["username"])
}
